package com.blackcat.annotation.bean.config;

import com.blackcat.annotation.bean.bean.User;
import com.blackcat.annotation.configuration.App;
import org.springframework.context.annotation.*;

/**
 * <p> 描述 ：@Configuration 声明当前类为配置类
 * @author : blackcat
 * @date : 2020/5/23 16:08
 */
@Configuration
@ComponentScan("com.blackcat.annotation.bean")
public class MyConfig {

    /**
     * <p> 描述 : @Bean的形式是使用的话， bean的默认名称是方法名
     * @author : blackcat
     * @date  : 2020/5/23 16:20
     * @see App ctx.getBean("user") 得到bean
     */
    @Bean(initMethod="init",destroyMethod="destroy")
    public User user(){
        return new User();
    }

    /**
     * <p> 描述 : @Bean的形式是使用的话， bean的默认名称是方法名
     * @author : blackcat
     * @date  : 2020/5/23 16:20
     * @see App ctx.getBean("user1") 得到bean
     */
    @Bean
    public User user1(){
        return new User();
    }

    /**
     * <p> 描述 : @Bean(value="bean的名称") 那么bean的名称是指定的
     * @author : blackcat
     * @date  : 2020/5/23 16:22
     * @see App ctx.getBean("user3") 得到bean
     */
    @Bean("user3")
    public User user2(){
        return new User();
    }


    /**
     * <p> 描述 : Bean的属性支持
     * @author : blackcat
     * @date  : 2020/5/23 17:31
     *
     * 在不指定@Scope的情况下，所有的bean都是单实例的bean,而且是饿汉加载(容器启动实例就创建好了)
     *
     * 指定@Scope为 prototype 表示为多实例的，而且还是懒汉模式加载（IOC容器启动的时候，并不会创建对象，而是 在第一次使用的时候才会创建）
     * 每次连接请求，都会生成一个bean实例，也会导致一个问题，当请求数越多，性能会降低，因为创建的实例，导致GC频繁，gc时长增加
     *
     * Scope指定的作用域方法取值:
     *      singleton 单实例的(默认) 全局有且仅有一个实例 以后每次获取都是从容器当中拿同一个对象（map当中）。
     *      prototype 多实例的  每次获取Bean的时候会有一个新的实例
     *      request 同一次请求  表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP request内有效  (web阶段时使用,无示例)
     *      session 同一个会话级别  表示该针对每一次HTTP请求都会产生一个新的bean，同时该bean仅在当前HTTP session内有效  (web阶段时使用,无示例)
     *      globalsession 给每一个 global http session新建一个Bean实例  类似于标准的HTTP Session作用域，不过它仅仅在基于portlet的web应用中才有意义  (web阶段时使用,无示例)
     */
    /*@Bean
    //@Scope(value = "prototype")
    //@Lazy // 主要针对单实例的bean 容器启动的时候，不创建对象，在第一次使用的时候才会创建该对象
    //@Primary // 自动装配时当出现多个Bean候选者时，被注解为@Primary的Bean将作为首选者
    public User user4(){
        System.out.println("容器开始创建bean.........");
        return new User();
    }*/



}
